package neuroPoker4.netze.input;

import java.util.ArrayList;

import neuroPoker.netze.NetAction;
import neuroPoker.netze.NetKarte;
import neuroPoker.netze.PokerInputSit;
import neuroPoker.poker.Spieler;
import neuroPoker.poker.Tisch;
import neuroPoker.poker.Enums.Actions;
import neuroPoker.poker.Enums.Stages;
import neuroPoker4.netze.tool.NetAction2;
import neuroPoker4.netze.tool.Util;

public class RiverInputSitBR1 extends PokerInputSit {

	public NetKarte[] handKarten = new NetKarte[2];

	public NetKarte[] flopKarten = new NetKarte[3];

	public NetKarte turnKarte;

	public NetKarte riverKarte;

	public ArrayList<NetAction> pfActionBR1 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> pfActionBR2 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> pfActionBR3 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> pfActionBR4 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> flopActionBR1 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> flopActionBR2 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> flopActionBR3 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> flopActionBR4 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> flopActionBR5 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> turnActionBR1 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> turnActionBR2 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> turnActionBR3 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> turnActionBR4 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> turnActionBR5 = new ArrayList<NetAction>(10);

	public ArrayList<NetAction> riverActionBR1 = new ArrayList<NetAction>(9);

	public RiverInputSitBR1(Tisch tisch, Spieler spieler) {
		this.spieler = spieler;
		// input
		// 2 Karten
		handKarten[0] = spieler.karten[0];
		handKarten[1] = spieler.karten[1];

		// flopkarten
		flopKarten[0] = tisch.karten.get(0);
		flopKarten[1] = tisch.karten.get(1);
		flopKarten[2] = tisch.karten.get(2);

		// turnkarte
		turnKarte = tisch.karten.get(3);

		// riverkarte
		riverKarte = tisch.karten.get(4);

		// preflop br1 action
		pfActionBR1 = getPrevBRAction(tisch, spieler, Stages.preFlop, 1);
		// preflop br2 action
		pfActionBR2 = getPrevBRAction(tisch, spieler, Stages.preFlop, 2);
		// preflop br3 action
		pfActionBR3 = getPrevBRAction(tisch, spieler, Stages.preFlop, 3);
		// preflop br4 action
		pfActionBR4 = getPrevBRAction(tisch, spieler, Stages.preFlop, 4);

		// flop br1 action
		flopActionBR1 = getPrevBRAction(tisch, spieler, Stages.flop, 1);
		// flop br2 action
		flopActionBR2 = getPrevBRAction(tisch, spieler, Stages.flop, 2);
		// flop br3 action
		flopActionBR3 = getPrevBRAction(tisch, spieler, Stages.flop, 3);
		// flop br4 action
		flopActionBR4 = getPrevBRAction(tisch, spieler, Stages.flop, 4);
		// flop br5 action
		flopActionBR5 = getPrevBRAction(tisch, spieler, Stages.flop, 5);

		// turn br1 action
		turnActionBR1 = getPrevBRAction(tisch, spieler, Stages.turn, 1);
		// turn br2 action
		turnActionBR2 = getPrevBRAction(tisch, spieler, Stages.turn, 2);
		// turn br3 action
		turnActionBR3 = getPrevBRAction(tisch, spieler, Stages.turn, 3);
		// turn br4 action
		turnActionBR4 = getPrevBRAction(tisch, spieler, Stages.turn, 4);
		// turn br5 action
		turnActionBR5 = getPrevBRAction(tisch, spieler, Stages.turn, 5);

		// river br1
		riverActionBR1 = getActBRAction(tisch, spieler, Stages.river, 1);
	}

	public double[] getInput() {
		// 326 input neuronen
		double[] input = new double[326];
		// kartenbits setzen
		// handkarten + flopkarten
		NetKarte[] netKarten = Util.concat(Util.concat(handKarten, flopKarten),
				new NetKarte[] { turnKarte, riverKarte });
		input = Util.setKartenBits(input, netKarten);

		// spieleraction bits setzen br1
		input = Util.setSpielerActionBits(input, pfActionBR1, 7, 1);
		// spieleraction bits setzen br2
		input = Util.setSpielerActionBits(input, pfActionBR2, 7, 2);
		// spieleraction bits setzen br3
		input = Util.setSpielerActionBits(input, pfActionBR3, 7, 3);
		// spieleraction bits setzen br4
		input = Util.setSpielerActionBits(input, pfActionBR4, 7, 4);
		// spieleraction bits setzen flop br1
		input = Util.setSpielerActionBits(input, flopActionBR1, 7, 5);
		// spieleraction bits setzen flop br2
		input = Util.setSpielerActionBits(input, flopActionBR2, 7, 6);
		// spieleraction bits setzen flop br3
		input = Util.setSpielerActionBits(input, flopActionBR3, 7, 7);
		// spieleraction bits setzen flop br4
		input = Util.setSpielerActionBits(input, flopActionBR4, 7, 8);
		// spieleraction bits setzen flop br5
		input = Util.setSpielerActionBits(input, flopActionBR5, 7, 9);
		// spieleraction bits setzen turn br1
		input = Util.setSpielerActionBits(input, turnActionBR1, 7, 10);
		// spieleraction bits setzen turn br2
		input = Util.setSpielerActionBits(input, turnActionBR2, 7, 11);
		// spieleraction bits setzen turn br3
		input = Util.setSpielerActionBits(input, turnActionBR3, 7, 12);
		// spieleraction bits setzen turn br4
		input = Util.setSpielerActionBits(input, turnActionBR4, 7, 13);
		// spieleraction bits setzen turn br5
		input = Util.setSpielerActionBits(input, turnActionBR5, 7, 14);
		// spieleraction bits setzen river br1
		input = Util.setSpielerActionBits(input, riverActionBR1, 7, 15);

		return input;
	}

	@Override
	protected NetAction getNewNetAction(int action) {
		return new NetAction2(action);
	}

	@Override
	protected NetAction getNewNetAction(Actions action) {
		return new NetAction2(NetAction.toActionConst(action));
	}

	@Override
	public boolean isLastActionFold() {
		return riverActionBR1.get(riverActionBR1.size() - 1).equals(
				NetAction.fold);
	}
}
